"""
参数传递

python 函数的参数传递：

不可变类型：类似 C++ 的值传递，如整数、字符串、元组。如 fun(a)，传递的只是 a 的值，没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值，则是新生成一个 a 的对象。

可变类型：类似 C++ 的引用传递，如 列表，字典。如 fun(la)，则是将 la 真正的传过去，修改后 fun 外部的 la 也会受影响
"""

a=[1,2,3]

a="Python"

"""
对象的类型
"""

"""
对象的更改
可更改(mutable)与不可更改(immutable)对象
在 python 中，strings, tuples, 和 numbers 是不可更改的对象，而 list,dict 等则是可以修改的对象。

不可变类型：变量赋值 a=5 后再赋值 a=10，这里实际是新生成一个 int 值对象 10，再让 a 指向它，而 5 被丢弃，不是改变 a 的值，相当于新生成了 a。

可变类型：变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改，本身la没有动，只是其内部的一部分值被修改了。

"""


"""
函数的参数传递
python 函数的参数传递：

不可变类型：类似 C++ 的值传递，如整数、字符串、元组。如 fun(a)，传递的只是 a 的值，没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值，则是新生成一个 a 的对象。

可变类型：类似 C++ 的引用传递，如 列表，字典。如 fun(la)，则是将 la 真正的传过去，修改后 fun 外部的 la 也会受影响
"""


"""
万物对象
python 中一切都是对象，严格意义我们不能说值传递还是引用传递，我们应该说传不可变对象和传可变对象。
"""


# python 传不可变对象实例
print("======内存地址查询===========")
def change(a):
    print(id(a))  # 指向的是同一个对象
    a = 10
    print(id(a))  # 一个新对象


a = 1
print(id(a))
change(a)

# 传可变对象实例
# !/usr/bin/python3

# 可写函数说明
def changeme(mylist):
    print("修改前函数内取值: ", mylist)
    #"修改传入的列表"
    mylist.append([1, 2, 3, 4])
    print("修改后函数内取值: ", mylist)
    return


# 调用changeme函数
mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: ", mylist)


"""
参数


"""

"""
参数类型
调用函数时可使用的正式参数类型：
必需参数
关键字参数
默认参数
不定长参数
"""
def printMsg(name,age):
    print(name)
    print(age)
    return
# 必需参数
"""
函数定义的参数
"""
# print(张三) # 缺参数，报错


# 关键字参数
printMsg(name="张三",age=20)
printMsg(age=22,name="李四")
# 默认参数
def printinfo( name, age = 35 ):
   # "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return

printinfo(name="王五")
printinfo(name="王二宝",age=50)
printinfo(age=50,name="杨延嗣")
# 不定长参数
# !/usr/bin/python3

# 可写函数说明

"""
元祖类型的
"""
def printMessage(arg1, *vartuple):
    #"打印任何传入的参数"
    print("输出: ")
    print(arg1)
    for var in vartuple:
        print(var)
    return


# 调用printinfo 函数
printMessage(10)
printMessage(70, 60, 50)
"""
字典类型的
"""
def printDict(arg1, **vardict ):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    print(vardict)

printDict(1, aa=2,bb=3)
